library(knitr)
library(dplyr)
library(sf)
library(mapsf)
library(RColorBrewer)
library(leaflet)
library(ggplot2)
library(plotly)Accessibilité et Potentiel
INTRODUCTION
Objectifs
Cette séance va permettre :
de consolider les apprentissages en matière de cartographie et d’analyse spatiale.
d’aborder de nouvelles données sous l’angle des problèmes de localisation optimale, dans une perspective soit de service public (e.g. localisation optimale des écoles ou des crèches), soit de concurrence spatiale (localisation d’un commerce maximisant la clientète).
de créer des fonctions-type de cartographie et d’analye spatiale pouvant être mobilisées ensuite dans vos applications shiny interactives.
Chargement des packages
L’installation est a priori la même que dans les sessions précédentes.cOn reprend juste pour mémoire la liste, à l’intention de ceux qui n’auraient pas suivi la séance précédente :
DONNEES
On dispose de cinq jeux de données sur Paris et les départements de Petite Couronne qui ont été téléchargés sur le site de l’INSEE ou du ministère des sports et légèrement retouchés pour en faciliter l’utilisation.
Contour des communes d’Ile de France
Ce fichier fournit le contour des communes de Paris et petite Couronne. On commence par vérifier le système de projection :
mapcom<-readRDS("ParisPC/mapcom_parisPC.RDS")
st_crs(mapcom)Coordinate Reference System:
User input: 4326
wkt:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AXIS["Latitude",NORTH],
AXIS["Longitude",EAST],
AUTHORITY["EPSG","4326"]]
Le système de projection EPSG = 4326 est celui qui convient pour leaflet. On peut visualiser l’ensemble des commune facilement :
leaflet() %>% addTiles() %>%
addPolygons(data=mapcom, # fonds de carte 4326
weight = 1, # épaisseur des traits
col = "red", # couleur
label = ~nom_com, # réaction souris
opacity = 0.3) # opacité du remplissageRevenus, pauvreté et niveau de vie en 2015 - Données carroyées
Ces données issues du “Dispositif Fichier localisé social et fiscal” (Filosofi) ont été créée pour des besoins de services public :
L’Insee fournit des informations socio-économiques sur près de 30 millions de ménages. Il diffuse ces informations à différentes échelles dont la plus petite est celle d’un carreau de 200 mètres de côté.
Ces statistiques locales permettent d’observer finement la situation socio-économique de la population de zones géographiques très ciblées. Elles représentent une source d’information précieuse pour aller au-devant des besoins des habitants et des acteurs économiques et accompagner la mise en œuvre de politiques publiques.
Source : INSEE
Examinons à titre d’exemple les carreaux correspondant majoritairement au territoire de la commune de Sucy-en-Brie (code = 94071)
gridpop<-readRDS("ParisPC/gridpop_parisPC.RDS")
leaflet() %>% addTiles() %>%
addPolygons(data=mapcom,
weight = 1,
col = "blue",
fillOpacity = 0.1) %>%
addPolygons(data=gridpop,
weight = 1,
col = "red",
opacity = 0.3) Comme on peut le voir, les carreaux ne sont présent que dans les zones peuplées et ne recouvrent pas les zones inhabitées.
Le fichier propose un grand nombre de variables dont on trouvera la description dans le document explicatif dictionnaire des variables accessible sur le site de l’INSEE
kable(head(st_drop_geometry(gridpop))[,1:10])| insee_com | I_pauv | Ind | Men | Men_pauv | Men_1ind | Men_5ind | Men_prop | Men_fmp | Ind_snv |
|---|---|---|---|---|---|---|---|---|---|
| 75119 | 0 | 2818.5 | 990 | 280 | 340 | 164 | 21 | 159 | 44265483 |
| 75111 | 0 | 1543.5 | 926 | 128 | 564 | 20 | 378 | 57 | 48209885 |
| 75119 | 0 | 1338.0 | 508 | 131 | 185 | 71 | 124 | 54 | 24681173 |
| 75119 | 0 | 1235.5 | 633 | 76 | 319 | 33 | 352 | 32 | 41531046 |
| 75120 | 0 | 685.0 | 349 | 134 | 201 | 22 | 46 | 28 | 12379153 |
| 75113 | 0 | 1728.0 | 751 | 115 | 311 | 63 | 177 | 106 | 43383686 |
Pour des raisons de confidentialités, les données ne peuvent toutefois être divulguées lorsqu’il y a moins de 10 à 20 ménages dans un carreau de la grille. Dans ce cas, les données sont “modifiées” en effectuant une sorte de moyenne avec les carreaux les plus proches.
Base des équipements sportifs
Cette base de données du ministère de l’équipement et des sports est accessible par ce lien. Elle fournit la position précise des équipements sportifs en indiquant leur type, leur ancienneté, leur accessibilité aux handicapés, etc. Nous avons réalisé une extraction pour les départements de Paris et petite couronne en ne retenant que quelques indicateurs.
equ<-readRDS("ParisPC/equip_ParisPC.RDS")
kable(head(equ))| insee_com | typ_code | typ_nom | typ_fam | dat_ser | prop | lon | lat | geometry |
|---|---|---|---|---|---|---|---|---|
| 75119 | 1205 | Practice | Parcours de golf | 2009 | Commune | 2.38027 | 48.88630 | POINT (2.38027 48.8863) |
| 75119 | 802 | Salle de musculation/cardiotraining | Equipement d’activités de forme et de santé | NA | Etablissement privé commercial | 2.38049 | 48.89280 | POINT (2.38049 48.8928) |
| 75119 | 2105 | Salle de danse | Salle ou terrain spécialisé | 1997 | Etablissement privé commercial | 2.37923 | 48.89400 | POINT (2.37923 48.894) |
| 75119 | 801 | Salle de cours collectifs | Equipement d’activités de forme et de santé | 2007 | Privé non commercial | 2.37056 | 48.87941 | POINT (2.37056 48.87941) |
| 75119 | 104 | Fosse à plongeon | Bassin de natation | 1972 | Commune | 2.38911 | 48.88210 | POINT (2.38911 48.8821) |
| 75119 | 1701 | Multisports/City-stades | Multisports/City-stades | 2005 | Commune | 2.38669 | 48.87640 | POINT (2.38669 48.8764) |
On peut voir que le fichier comporte 109 équipements, certains étant rares et d’autres fréquents.
tab<-equ %>% st_drop_geometry() %>%
count(typ_code,typ_nom) %>%
arrange(-n)
kable(head(tab,25))| typ_code | typ_nom | n |
|---|---|---|
| 501 | Court de tennis | 1991 |
| 1901 | Salle multisports (gymnase) | 1339 |
| 1701 | Multisports/City-stades | 1063 |
| 802 | Salle de musculation/cardiotraining | 821 |
| 2802 | Terrain de football | 680 |
| 2105 | Salle de danse | 584 |
| 1801 | Dojo / Salle d’arts martiaux | 478 |
| 2201 | Salles polyvalentes / des fêtes / non spécialisées | 462 |
| 801 | Salle de cours collectifs | 415 |
| 202 | Terrain de pétanque | 374 |
| 2901 | Terrain de basket-ball | 364 |
| 1004 | Piste d’athlétisme isolée | 219 |
| 102 | Bassin sportif de natation | 212 |
| 2701 | Structure Artificielle d’Escalade | 196 |
| 2106 | Salle de gymnastique sportive | 175 |
| 1001 | Stade d’athlétisme | 148 |
| 2111 | Salle de tennis de table | 148 |
| 103 | Bassin ludique de natation | 146 |
| 2117 | Salle ou terrain de squash | 142 |
| 1105 | Mur de tennis | 122 |
| 2903 | Terrain de handball | 119 |
| 1802 | Salle de boxe | 114 |
| 1401 | Pas de tir à l’arc | 112 |
| 2803 | Terrain de rugby | 109 |
| 1003 | Aire de saut | 96 |
Examinons à titre d’exemple la localisation des terrains de football (code 2802) autour de la commeune de Sucy-en-Brie (code 94071)
myequ<-equ %>% filter(typ_code %in% c("2803"))
leaflet() %>% addProviderTiles('Esri.WorldTopoMap') %>%
addPolygons(data=mapcom,
weight = 1,
col = "blue",
fillOpacity = 0.1) %>%
addCircleMarkers(data=myequ,
radius = 3,
stroke = T,
weight = 2,
color="red",
fillColor = "yellow")Exercice : Faites une carte de la distribution de votre équipement.
ACCESSIBILITE
Nous allons calculer l’accessibilité de la population de Sucy-en-Brie aux terrains de football localisés à l’intérieur de ses frontières.
Préparation des données
On extrait les contours de la commune choisie et sa population sur grille puis on projette les deux cartes dans la projection Lambert (crs=2154) afin de pouvoir mesurer les distances à vol d’oiseau en km. On calcule le centre des grilles pour positionner les populations.
mymap <- mapcom %>% filter(insee_com=="94071") %>%
st_transform(2154)
mypop <- gridpop %>% filter(insee_com== "94071") %>%
select(w = "Ind") %>%
st_transform(2154)On extrait ensuite les équipements qui nous intéressent en ne retenant dans un premier temps que ceux qui sont présents dans la commune :
myequ <- equ %>% filter(typ_code==2802,
insee_com == "94071") %>%
mutate(w=1) %>%
select(w) %>%
st_transform(2154)On vérifie à l’aide d’une carte que tout se superpose bien :
# carte de base de type polygone
mf_map(mymap, type="base",
col="lightyellow")
# Carte de stock
mf_map(mypop, type="prop",
var="w",
inches=0.05, # réglage de la taille dez symboles
symbol = "square", # forme des symboles
col="red",
leg_pos = "topright", # position de la légende
leg_title = "Population") # Titre de la légende
# Carte de base de type point
mf_map(myequ, type="base",
pch=20,
col="black",
leg_pos = "topleft",
leg_title = "Equipement",
add=T) # Superposition sur les cartes précédentes
# Titre, cadre, échelle, source ...
mf_layout(title = "Population et ressources",
scale = T,
frame=T,
arrow=F,
credits = "Source : INSEE et Min. Sports, 2024"
)Calcul de la distance Population x Ressource
Le calcul va être effectué par la fonction st_distance() du package sf. Elle ne fonctionne que si le fonds de carte a été projetée, ce que nous avons fait avant. On la transforme en numérique puis en matrice et on calcule pour chaque point de population sa distance minimum à l’équipement choisi en mètres
D <-st_distance(mypop, myequ, by_element = F)
class(D)<-"matrix"
D[1:3,1:5] [,1] [,2] [,3] [,4] [,5]
[1,] 3855.405 3971.156 1465.316 4122.109 4060.326
[2,] 1787.188 1936.501 1319.309 2055.465 1989.679
[3,] 2163.856 2321.926 1346.151 2430.599 2363.762
Calcul de la distance minimum
On calcule pour chaque point de la grille population sa distance minimale à l’équipement et on effectue la moyenne pondérée :
mypop$Dmin <- apply(D,1,min)
Dmintot <- sum(mypop$Dmin*mypop$w)/sum(mypop$w)
Dmintot[1] 837.692
On constate que les habitants de la commune sont en moyenne à 837.6 mètres de l’équipement le plus proche.
Courbe d’accessibilité minimale de la population
Une solution plus générale consiste à calculer une courbe de fréquence cumulée indiquant combien d’habitants sont situés à moins d’une certaine distance de l’équipement.
tabfreq<-data.frame(dis= mypop$Dmin, pop = mypop$w) %>%
arrange(dis) %>%
mutate(cumpop=cumsum(pop)) %>%
mutate(cumfreq=100*cumpop/sum(pop))
head(tabfreq) dis pop cumpop cumfreq
1 0.00000 3.0 3.0 0.0112049
2 0.00000 21.0 24.0 0.0896392
3 0.00000 118.0 142.0 0.5303653
4 0.00000 3.0 145.0 0.5415702
5 59.90465 443.5 588.5 2.1980279
6 71.12526 181.0 769.5 2.8740569
On voit ainsi par exemple que 769 habitants sont situés à moins de 178 mètres de l’équipement ce qui représente 2.87% de la population de la commune. On trace le résultat avec ggplot2 :
p<-ggplot(tabfreq) + aes(x=dis, y=cumfreq) +
geom_line() +
scale_x_continuous(name = "Distance minimale à l'équipement") +
scale_y_continuous(name = "% de la population") +
ggtitle("Courbe d'accessibilité minimale")
ggplotly(p)On peut alors voir en promenant le curseur sur la courbe quel % de la poplation se trouve à moins d’une certaine distance de l’équipement le plus proche et répondre aux questions telles que :
- Q1 : quel % de la population est située à moins de 500 m ? environ 26%
- Q2 : quel % de la population est située à plus de 1500 m ? environ 4%
- Q3 : A quelle distance se trouvent les 10% les plus favorisés ? moins de 258 m
- Q4 : A quelle distance se trouvent les 10% les moins favorisés ? plus de 1371m
- Q5 : quelle est la distance médiane à l’équipement le plus proche ? 900 m
Cartographie
On peut faire une carte représentant la localisation et l’effectif des populations favorisés et défavorisés. On va utiliser pour cela des carrés dont la surface sera proportionnlle à la population et la couleur à l’accessibilité minimale à l’équipement le plus proche. On utilisera comme seuil cartographique de référence la distance moyenne et ses valeurs divisées par deux ou multipliées par deux.
mf_map(mymap, type="base",
col="lightyellow")
mybreaks<-c(min(mypop$Dmin), Dmintot/2, Dmintot, Dmintot*2, max(mypop$Dmin))
mypal<-rev(brewer.pal(4,"RdYlBu"))
mf_map(mypop, type="prop_choro",
var=c("w", "Dmin"),
inches=0.05,
pal=mypal,
breaks=mybreaks,
symbol = "square",
leg_pos = c("topleft","topright"),
leg_title = c("Population", "Distance minimale (en m)"),
leg_val_rnd = c(0,0)
)
mf_map(myequ, type="base",
pch=20,
col="black",
leg_pos = "topleft",
leg_title = "Equipement",
add=T)
mf_layout(title = "Accessibilité de la population à la ressource",
scale = T,
frame=T,
arrow=F,
credits = "Source : INSEE et Min. Sports, 2024"
)Exercice : refaire les calculs précédents pour tout le Grand Paris
## Chargement des fichiers
mymap <- mapcom %>% st_transform(2154)
mypop <- gridpop %>% select(w = "Ind") %>%
st_transform(2154)
myequ <- equ %>% filter(typ_code==2802) %>%
mutate(w=1) %>%
select(w) %>%
st_transform(2154)
## Calcul de la matrice de distance
D <-st_distance(mypop, myequ, by_element = F)
class(D)<-"matrix"
D[1:3,1:5] [,1] [,2] [,3] [,4] [,5]
[1,] 5253.313 352.0405 4367.758 6420.792 6979.968
[2,] 3212.081 3890.0556 2882.108 3799.088 3930.807
[3,] 5580.766 906.8593 4756.769 6655.044 7102.999
## Calcul de la distance minimale moyenne
mypop$Dmin <- apply(D,1,min)
Dmintot <- sum(mypop$Dmin*mypop$w)/sum(mypop$w)
Dmintot[1] 750.3469
## Tableau de distance cumulée
tabfreq<-data.frame(dis= mypop$Dmin, pop = mypop$w) %>%
arrange(dis) %>%
mutate(cumpop=cumsum(pop)) %>%
mutate(cumfreq=100*cumpop/sum(pop))
head(tabfreq) dis pop cumpop cumfreq
1 0 243.0 243.0 0.003653544
2 0 140.0 383.0 0.005758467
3 0 5.0 388.0 0.005833643
4 0 563.5 951.5 0.014305957
5 0 94.0 1045.5 0.015719262
6 0 7.5 1053.0 0.015832026
## Graphique d'accessibilité
p<-ggplot(tabfreq) + aes(x=dis, y=cumfreq) +
geom_line() +
scale_x_continuous(name = "Distance minimale à l'équipement") +
scale_y_continuous(name = "% de la population") +
ggtitle("Courbe d'accessibilité minimale")
ggplotly(p)## Carte d'accessibilité
mf_map(mymap, type="base",
col="lightyellow")
mybreaks<-c(min(mypop$Dmin), Dmintot/2, Dmintot, Dmintot*2, max(mypop$Dmin))
mypal<-rev(brewer.pal(4,"RdYlBu"))
mf_map(mypop, type="prop_choro",
var=c("w", "Dmin"),
inches=0.05,
pal=mypal,
border = NA,
breaks=mybreaks,
symbol = "square",
leg_pos = c("topleft","topright"),
leg_title = c("Population", "Distance minimale (en m)"),
leg_val_rnd = c(0,0)
)
mf_map(myequ, type="base",
pch=20,
cex=0.2,
col="black",
leg_pos = "topleft",
leg_title = "Equipement",
add=T)
mf_layout(title = "Accessibilité de la population aux terrain de football le plus proche ",
scale = T,
frame=T,
arrow=F,
credits = "Source : INSEE et Min. Sports, 2024"
)POTENTIEL
On repart de la matrice des distances mais on va calculer cette fois-ci le nombre d’équipement situés à moins d’une certaine distance du lieu d’habitat. On va utiliser cette fois-ci les centres de commune comme point de référence :
Préparation des données
mycom <- mapcom %>% st_transform(2154)
myequ <- equ %>% filter(typ_code==2802) %>%
st_transform(2154)Distance
matdis <-st_distance(mycom,myequ)
matdis<-as.matrix(matdis)
class(matdis)<-"matrix"
row.names(matdis)<-mycom$insee_com
matdis[1:5,1:7] [,1] [,2] [,3] [,4] [,5] [,6] [,7]
75119 2923.439 0.000 1984.378 4149.837 4732.112 6842.183 6240.701
75106 5101.953 5582.947 5044.986 5181.630 4750.000 8941.392 8257.951
93071 11199.722 10019.160 10589.325 12318.792 13406.187 11929.699 11836.841
94056 19504.036 25241.280 20382.510 18446.918 18215.258 15436.621 16011.799
94041 3376.855 8172.080 4180.139 2185.553 1107.208 3733.509 3302.157
Calcul du nombre d’équipement à moins de 1000 m
On transforme la matrice en 0 ou 1 selon la distance
mat2000 <- matdis<1000
mycom$pot2000<-apply(mat2000,1,sum)Cartographie du résultat
mf_map(mycom, type = "choro",
var="pot2000",
breaks=c(0,5,10,15,20,25,30,max(mycom$pot2000)),
leg_pos = "topright",
leg_title = "nb. equipt < 1000 m",
leg_val_rnd = 0)
mf_map(myequ, type="base",
pch=20,
cex=0.4,
col="red",
add=TRUE)
mf_layout(title= "Potentiel d'équipement",
frame=T,
credits = "Source : INSEE & Min. des Sports")PROLONGEMENTS
Nous avons été très rapide sur la notion de potentiel. Les personnes intéressées pour en savoir plus pourront lire en premier la vignette du Package R potential qui résume de façon rapide les principes du calcul de potentiel et décrivent les fonctions à mettre en oeuvre sous R pour réaliser une carte de potentiel.
Pour une compréhension plus approfondie du concept, on pourra se reporter aux articles de Grasland, 1990 ou de Grasland & al., 1993 qui ont profondément renouveler les méthodes de calcul du potentiel par rapport à la formulation initiale de J.Q. Stewart, 1947 qui était inspirée des lois de la gravitation universelle.